// ============================== 导入依赖 ============================== //

import Vue from 'vue'

export const DATA = [
  'CACHE', // 公共缓存
  'USER', // 公共用户

  'MENU', // 菜单
  'ORGAN', // 组织
  'REGION', // 区域

  'MAP', // 公共映射
  'DICT', // 公共字典
  'THEME', // 公共主题

  'TIME', // 时间配置
  'SOCKET', // SOCKET 配置

  'WATCH', // 公共监听
]

export const current = {
  id: '',
  name: '',
  idList: [],
  nameList: [],
  catalogue: '',
  describe: '',
  icon: '',
  project: '',
  remark: '',
}

// ============================== 导出初始化工具 ============================== //

export default {
  /**
   * 初始化内核
   */
  async initCORE() {
    this.themeInit()
  },

  /**
   * 初始化仓库
   */
  initStore() {
    return {}
  },

  /**
   * 初始化成功
   */
  initSuccess(App) {
    // 生成路由器
    this.routeNew()

    // 路由拦截
    this.routeBeforeEach()

    // 挂载应用
    const CORE = DATA.reduce((obj, key) => ({ ...obj, [key]: this[key] }), {})
    const mixin = this.initStore()
    new Vue({
      render: (h) => h(App),
      data: () => ({ CORE }),
      router: this.ROUTE.router,
      mixins: [mixin],
      watch: {
        $route: ({ name, meta }) => {
          const menu = meta.menu || name
          this.MENU.current = this.MENU.ROUTE[menu] || current
        },
      },
    }).$mount('#app')
  },

  /**
   * 初始化异常
   */
  async initCatch(e) {
    // 关闭遮罩
    this.unloading()
    this.logError('页面初始化', {}, e)
    await this.ALERT.error('初始化失败，请刷新重试', '页面初始化')
    location.reload()
  },

  /**
   * 初始化对象
   */
  initObj(...classList) {
    const objList = classList.map((item) => transDTO(item, this))
    return this.merge({}, ...objList)
  },
}

// ============================== 内部方法 ============================== //

const transDTO = (DTO, CORE) => {
  if (!CORE.isClass(DTO)) return CORE.json(DTO)

  const data = new DTO()
  if (CORE.isFunction(data.toObject)) return data.toObject()

  const { page, pageSize, ...other } = CORE.json(data)
  return other
}
